/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Persistencia;

/**
 *
 * @author RafaelGutierrez
 */
import cprincipal.Citas;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;

public class CitaXmlClinica {

    private Element root;
    private String fileLocation = "src/Archivos/citasClinica.xml";

    public CitaXmlClinica() {
        try {
            SAXBuilder builder = new SAXBuilder(false);
            Document doc = null;
            doc = builder.build(fileLocation);
            root = doc.getRootElement();
        } catch (JDOMException ex) {
            System.out.println("No se pudo iniciar la operacion por: " + ex.getMessage());
        } catch (IOException ex) {
            System.out.println("No se pudo iniciar la operacion por: " + ex.getMessage());
        }
    }

    private Element CitatoXmlElement(Citas nCita) {
        Element Citatrans = new Element("cita");

            Element nombredoctor = new Element("nombredoctor");
                nombredoctor.setText(nCita.getNombredoctor());

            Element ceduladoctor = new Element("ceduladoctor");
                ceduladoctor.setText(Integer.toString(nCita.getCeduladoctor()));

            Element nombrepaciente = new Element("nombrepaciente");
                nombrepaciente.setText(nCita.getNombrepaciente());

            Element cedulapaciente = new Element("cedulapaciente");
                cedulapaciente.setText(Integer.toString(nCita.getCedulapaciente()));

            Element disponible = new Element ("disponible");
                disponible.setText(nCita.getDisponible()); 

            Element fecha = new Element ("fecha");
                fecha.setText(nCita.getFecha());

            Element hora = new Element ("hora");
                hora.setText(nCita.getHora());



        Citatrans.addContent(nombredoctor);
        Citatrans.addContent(ceduladoctor);
        Citatrans.addContent(nombrepaciente);
        Citatrans.addContent(cedulapaciente);
        Citatrans.addContent(disponible);
        Citatrans.addContent(fecha);
        Citatrans.addContent(hora);

        return Citatrans;
    }

    /*Método que retorna un Estudiante. A este metodo se le manda un Element y con
    sus datos se hará los pasos requeridos para crear el Estudiante*/

    private Citas CitatoObject(Element element) throws ParseException {
        Citas nCita = new Citas();

                nCita.setNombredoctor(element.getChildText("nombredoctor"));
                nCita.setCeduladoctor(Integer.parseInt(element.getChildText("ceduladoctor")));
                nCita.setNombrepaciente(element.getChildText("nombrepaciente"));
                nCita.setCedulapaciente(Integer.parseInt(element.getChildText("cedulapaciente")));
                nCita.setDisponible(element.getChildText("disponible"));
                nCita.setFecha(element.getChildText("fecha"));
                nCita.setHora(element.getChildText("hora"));

        return nCita;
    }


    private boolean updateDocument() {
        try {
            XMLOutputter out = new XMLOutputter(org.jdom.output.Format.getPrettyFormat());
            FileOutputStream file = new FileOutputStream(fileLocation);
            out.output(root, file);
            file.flush();
            file.close();
            return true;
        } catch (Exception e) {
            System.out.println("error: " + e.getMessage());
            return false;
        }
    }

    public static Element buscar(List raiz, String dato, String fecha, String hora) {
        Iterator i = raiz.iterator();
        while (i.hasNext()) {
            Element e = (Element) i.next();
            if (dato.equals(e.getChild("cedulapaciente").getText())&&fecha.equals(e.getChild("fecha").getText())
                    &&hora.equals(e.getChild("hora").getText())) {
                    System.out.println("cedula paciente: "+e.getChildText("cedulapaciente"));
                return e;
            }
        }
        return null;
    }

    public boolean agregarCita(Citas nCita) {
        boolean resultado = false;
        root.addContent(CitatoXmlElement(nCita));
        resultado = updateDocument();
        return resultado;
    }

   public Citas buscarCita(Integer cedula, String fecha, String hora) {
        Element aux = new Element("cita");
        List Citas = this.root.getChildren("cita");
        while (aux != null) {
            aux = CitaXmlClinica.buscar(Citas, Integer.toString(cedula), fecha, hora);
            if (aux != null) {
                try {
                    return CitatoObject(aux);
                } catch (ParseException ex) {
                    System.out.println(ex.getMessage());
                }
            }
        }
        return null;
    }
   
   public static Element buscar2(List raiz, String dato, String fecha, String hora) {
        Iterator i = raiz.iterator();
        while (i.hasNext()) {
            Element e = (Element) i.next();
            if (dato.equals(e.getChild("ceduladoctor").getText())&&fecha.equals(e.getChild("fecha").getText())
                    &&hora.equals(e.getChild("hora").getText())) {
                return e;
            }
        }
        return null;
    }


   public Citas buscarCita2(Integer cedula, String fecha, String hora) {
        Element aux = new Element("cita");
        List Citas = this.root.getChildren("cita");
        while (aux != null) {
            aux = CitaXmlClinica.buscar2(Citas, Integer.toString(cedula), fecha, hora);
            if (aux != null) {
                try {
                    return CitatoObject(aux);
                } catch (ParseException ex) {
                    System.out.println(ex.getMessage());
                }
            }
        }
        return null;
    }

//    public boolean actualizarDoctor(Citas nCita) {
//        boolean resultado = false;
//        Element aux = new Element("cita");
//        List Cita = this.root.getChildren("cita");
//        while (aux != null) {
//            aux = CitaXmlClinica.buscar(Cita, nCita.getHora());
//            if (aux != null) {
//                Cita.remove(aux);
//                resultado = updateDocument();
//            }
//        }
//        agregarCita(nCita);
//        return resultado;
//    }

    /* @param cedula cedula del Estudiante a borrar
     * @return valor boleano con la condicion de exito  */
//    public boolean borrarDoctor(Integer cedula) {
//        boolean resultado = false;
//        Element aux = new Element("doctor");
//        List Cita = this.root.getChildren("doctor");
//        while (aux != null) {
//            aux = DoctorXml.buscar(Doctores, String.valueOf(cedula));
//            if (aux != null) {
//                Doctores.remove(aux);
//                resultado = updateDocument();
//            }
//        }
//        return resultado;
//    }


    /* Para obtener todos los Estudiantes
     * @return ArrayList con todos los objetos Estudiante  */
    public ArrayList<Citas> todoslascitas() {
        ArrayList<Citas> resultado = new ArrayList<Citas>();
        for (Object it : root.getChildren()) {
            Element xmlElem = (Element) it;
            try {
                resultado.add(CitatoObject(xmlElem));
            } catch (ParseException ex) {
                System.out.println(ex.getMessage());
            }
        }
        return resultado;
    }

}
